<?php
/**
 * Класс User Базовый класс пользователя
 *  @author Mike
 */

class User_User extends ActiveRecord {
	protected $tableName = 'user';
	protected $pkName = 'ID_user';
	protected $fieldsRules = array (
								'first_name' => array('type' => 'name', 'min' => 2, 'max' => 64),
								'last_name' => array('type' => 'name', 'min' => 2, 'max' => 64),
								'password' => array('type' => 'password'),
								'e_mail' => array('type' => 'email'),
								'phone' => array('type' => 'number','min' => 10, 'max' => 15, 'allowNull' => true),
								'favorite_team' => array('min' => 1, 'max' => 256, 'allowNull' => true),
								'favorite_player' => array('min' => 1, 'max' => 256, 'allowNull' => true),
								'favorite_number' => array('min' => 1, 'max' => 2, 'allowNull' => true)
								
								
								);
	
	public function beforeValidationOnCreate() {
		// Проверяем совпдает ли пароль и его подтверждение
		if($this->tableFields['password'] != $this->tableFields['confirm']) $this->arrErrors[] = 'Пароль и его подтверждение не совпдает';	
		unset ($this->tableFields['confirm']);
		
		// Проверяем не занята ли почта
		if(!$this->isFreeEmail($this->getField('e_mail'))) $this->arrErrors[] = 'Почта уже существует';
	}
	
	public function beforeCreate() {
		$this->setField('password', md5($this->getField('e_mail') . $this->getField('password') . 'outsider'));
	}
	
	public function beforeUpdate() {
		// Если в POST есть город, но его значение пусто 
		if(isset($this->tableFields['city_name']) && $this->tableFields['city_name'] == '') $this->setField('ID_city', null);
		unset($this->tableFields['city_name']);
		
		// Проверяем поля даты(день, месяц, год)
		$flag = true;
		if(isset($this->tableFields['day']) && isset($this->tableFields['month']) && isset($this->tableFields['year'])) {
			if(!$this->tableFields['day'] || !$this->tableFields['month'] || !$this->tableFields['year']) $flag = false;
			elseif($this->tableFields['month'] == 2 && ($this->tableFields['day'] > 29 || ($this->tableFields['day'] == 29 && $this->tableFields['year'] % 4))) $flag = false;
			elseif(($this->tableFields['month'] < 8 && $this->tableFields['day'] == 31 && !($this->tableFields['month'] % 2 )) || ($this->tableFields['month'] > 7 &&  $this->tableFields['day'] == 31 && $this->tableFields['month'] % 2)) $flag = false;
			
			if(!$flag) $this->setField('date_birth', null);
			else $this->setField('date_birth', $this->tableFields['year'] . '-' . $this->tableFields['month'] . '-' . $this->tableFields['day']);
			unset($this->tableFields['day'], $this->tableFields['month'], $this->tableFields['year']);
		}
	}
	
	protected function afterCreate() {
		User_Seance::authorizationIn($this);
	}
	
	/**
	 * Метод проверяет существование пользователя в БД с заданным e-mail
	 * 
	 * @param string $email - e-mail для проверки
	 * @return bool
	 */
	public function isFreeEmail($eMail) {
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `user`.`ID_user` 
				 FROM `user` 
				 WHERE `user`.`e_mail` = '" . Service_Escape::absolutelyEscapeString($eMail) . "'";
		if($objDB->selectOneValue($stmt)) return false;
		else return true;
	}
	
	// В этом методе из трёх элементов массива POST (birth_day,birth_month,birth_year) получаем строку даты для сохранения, после чего первые элементы удаляются из массива объекта
	// А также обнуляем 
	public function beforeCheckFields() {
		// Из 3 селектов (Год, месяц, день) собираем строку для сохранения даты - год-месяц-день
		if(isset($_POST['User']['birth_day']) && isset($_POST['User']['birth_month']) && isset($_POST['User']['birth_year'])) {
			$this->tableFields['date_birth'] = $_POST['User']['birth_year'] . '-' . $_POST['User']['birth_month'] . '-' . $_POST['User']['birth_day'];	
			//Удаляем отдельные записи (число, месяц, год)
			unset ($this->tableFields['birth_day'],$this->tableFields['birth_month'],$this->tableFields['birth_year']);
		}
		// Обнуляем необязательные поля профиля, которые пользователь не заполнил
		foreach ($this->tableFields as $key => $value) if ($value == '') $this->tableFields[$key] = null;
	}
	
	/**
	 * Метод сохраняет параметры поиска пользователя(Реадктирование профиля, вкладка "Поиск")
	 *
	 */
	public function EditSearchParameters() {
		$objDB = Service_Database::instanse();
		$userArray = $_POST['User_User'];
		
		if(!isset($userArray['line']) || (isset($userArray['line']) && !isset($userArray['line1']) && !isset($userArray['line2']) && !isset($userArray['line3']) && !isset($userArray['line4']) )) {
		// Если не отмечен чекбокс доступности поиска или отмечен, но не выбрано ни одного амплуа, то удаляем все записи, которые могут быть
			if($this->updateFields(array('search_status' => 0))) {
				$stmt = "DELETE FROM `player_search` WHERE `ID_user`='" . $this->id . "'";
				$objDB->query($stmt);
			}
		}
		else {
			unset($userArray['line']);
			
			// Удаляем все старые записи
			$stmt = "DELETE FROM `player_search` WHERE `ID_user`='" . $this->id . "'";
			$objDB->query($stmt);
			
			$i = 0;
			$stmt = "INSERT INTO `player_search`(`ID_user`,`line`) VALUES";

			foreach($userArray as $line => $checkflag) { // По идее здесь должны быть только чекбоксы, если есть ещё что-то - ломают
				switch($line) {
					case 'line1' :
						$stmt .= "('" . $this->id . "', 1)";
						$i++;
						break;
					case 'line2' :
						$stmt .= "('" . $this->id . "', 2)";
						$i++;
						break;
					case 'line3' :
						$stmt .= "('" . $this->id . "', 3)";
						$i++;
						break;
					case 'line4' :
						$stmt .= "('" . $this->id . "', 4)";
						$i++;
						break;
				}
				$stmt .= ($i == count($userArray)) ? ';' : ',';
			}
			if($objDB->query($stmt)) $this->updateFields(array('search_status' => 1));
		}
	}
	
	/**
	 * Метод получает параметры поиска для текущего поиска(по каким амплуа он будет выдаваться в поиске)
	 *
	 */
	public function getSearchParameters() {
		$objDB = Service_Database::instanse();
		$stmt = "SELECT `player_search`.`line`
				FROM `player_search`
				WHERE `player_search`.`ID_user`='" . $this->id . "'";
		return $objDB->selectOneColumn($stmt);
	}
}

?>